using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public ObjetoVO getObjeto(int? idObjeto, string objeto)
		{
			ObjetoVO objetoVO = null;
			List<ObjetoVO> listObjetoVOs = getObjetos(idObjeto, objeto, null);
			if (listObjetoVOs != null && listObjetoVOs.Count > 0)
			{
				objetoVO = listObjetoVOs[0];
			}
			return objetoVO;
		}

		public ObjetoVO getObjeto(int? idObjeto)
		{
			return getObjeto(idObjeto, null);
		}

		public List<ObjetoVO> getObjetos()
		{
			return getObjetos(null, null, null);
		}

		public List<ObjetoVO> getObjetos(int? idObjeto)
		{
			return getObjetos(idObjeto, null, null);
		}

		public List<ObjetoVO> getObjetos(int? idObjeto, string objeto, string descricao)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT obi.idObjeto as obi_idObjeto, obi.objeto as obi_objeto, obi.descricao as obi_descricao, obi.Cadastro as obi_Cadastro, obi.CadastradoPor as obi_CadastradoPor, obi.Edicao as obi_Edicao, obi.EditadoPor as obi_EditadoPor  ");
			query.AppendLine("FROM objeto as obi ");
			if (idObjeto != null)
			{
				query.AppendLine(where + "obi.idObjeto=@idObjeto ");
				where = "AND ";
			}
			if (objeto != null)
			{
				query.AppendLine(where + "obi.objeto LIKE @objeto ");
				where = "AND ";
			}
			if (descricao != null)
			{
				query.AppendLine(where + "obi.descricao=@descricao ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY obi.objeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idObjeto!= null) cmd.Parameters.Add(getParameter(cmd, "@idObjeto", idObjeto));
			if (objeto!= null) cmd.Parameters.Add(getParameter(cmd, "@objeto", "%"+objeto+"%"));
			if (descricao!= null) cmd.Parameters.Add(getParameter(cmd, "@descricao", descricao));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<ObjetoVO> listObjeto = new List<ObjetoVO>();

				while (reader.Read())
				{
					ObjetoVO objetoVO = ObjetoVO.CreateVO();
					objetoVO.idObjeto = reader.GetInt32(reader.GetOrdinal("obi_idObjeto"));
					objetoVO.objeto = reader.GetString(reader.GetOrdinal("obi_objeto"));
					if (!reader.IsDBNull(reader.GetOrdinal("obi_descricao")))
						objetoVO.descricao = reader.GetString(reader.GetOrdinal("obi_descricao"));
					objetoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("obi_Cadastro"));
					objetoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("obi_CadastradoPor"));
					objetoVO.edicao = reader.GetDateTime(reader.GetOrdinal("obi_Edicao"));
					objetoVO.editadoPor = reader.GetString(reader.GetOrdinal("obi_EditadoPor"));


					listObjeto.Add(objetoVO);
				}
				reader.Close();
				return listObjeto;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setObjeto(ObjetoVO objetoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE objeto ");
			query.AppendLine("SET objeto=@objeto, descricao=@descricao,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idObjeto=@idObjeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idObjeto", objetoVO.idObjeto));
			cmd.Parameters.Add(getParameter(cmd, "@objeto", objetoVO.objeto));
			if (objetoVO.descricao == null)
				cmd.Parameters.Add(getParameter(cmd, "@descricao", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@descricao", objetoVO.descricao));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", objetoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", objetoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", objetoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", objetoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newObjeto(ObjetoVO objetoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO objeto ");
			query.AppendLine("  ( objeto, descricao, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @objeto, @descricao, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@objeto", objetoVO.objeto));
			if (objetoVO.descricao == null)
				cmd.Parameters.Add(getParameter(cmd, "@descricao", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@descricao", objetoVO.descricao));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", objetoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", objetoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", objetoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", objetoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('objeto') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delObjeto(ObjetoVO objetoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM objeto ");
			query.AppendLine("WHERE idObjeto=@idObjeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idObjeto", objetoVO.idObjeto));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
	}
}
